"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var 路径 = require("path");
var fs = require("fs");
function 启动() {
    if (process.argv.length < 3) {
        console.log("使用:");
        console.log("\t节点 处理诊断消息.js <诊断JSON输入文件>");
        return;
    }
    function 写文件(文件名, 内容) {
        fs.writeFile(路径.join(路径.dirname(输入文件路径), 文件名), 内容, { encoding: "utf-8" }, function (err) {
            if (err)
                throw err;
        });
    }
    var 输入文件路径 = process.argv[2].replace(/\\/g, "/");
    console.log("从诊断信息数据文件 " + 输入文件路径 + " 读入数据");
    var 输入文本 = fs.readFileSync(输入文件路径, { encoding: "utf-8" });
    var 诊断消息数据 = JSON.parse(输入文本);
    var 诊断消息 = new Map();
    for (var 键 in 诊断消息数据) {
        if (Object.prototype.hasOwnProperty.call(诊断消息数据, 键)) {
            诊断消息.set(键, 诊断消息数据[键]);
        }
    }
    var 输出文件路径 = 路径.dirname(输入文件路径);
    var 本文件相对路径 = 路径.relative(process.cwd(), 输出文件路径);
    var 文件输出信息 = 构建信息文件输出(诊断消息, "./诊断消息.cts", 本文件相对路径);
    检查唯一代码(诊断消息);
    写文件("诊断消息.cts", 文件输出信息);
    var 输出消息 = 构建诊断消息输出(诊断消息);
    写文件("诊断消息.生成.json", 输出消息);
}
function 检查唯一代码(诊断信息表) {
    var 全部代码 = [];
    诊断信息表.forEach(function (_a) {
        var code = _a.代码;
        if (全部代码[code]) {
            throw new Error("诊断消息代码" + code + "出现多次.");
        }
        全部代码[code] = true;
    });
}
function 构建信息文件输出(消息表, 输入文件相对路径, 本文件相对路径) {
    var 结果 = "// <自动生成 />\r\n" +
        "// 从'" + 本文件相对路径.replace(/\\/g, '/') + "/诊断消息.json' 生成 '" + 输入文件相对路径 + "'\r\n" +
        "/* @internal */\r\n" +
        "名域 ts {\r\n" +
        "    函数 diag(代码: 数字, 级别: 诊断级别_, 键: 文字, 消息: 文字, 不需要报告?: {}): 诊断信息_ {\r\n" +
        "        返回 { 代码, 级别, 键, 消息, 不需要报告 };\r\n" +
        "    }\r\n" +
        "    导出 常量 诊断信息_ = {\r\n";
    消息表.forEach(function (_a, 名称) {
        var 代码 = _a.代码, 级别 = _a.级别, 不需要报告 = _a.不需要报告;
        var 属性名 = 转换属性名称(名称);
        var 不需要报告参数 = 不需要报告 ? ", /*不需要报告*/ " + 不需要报告 : "";
        结果 += "        " + 属性名 + ": diag(" + 代码 + ", 诊断级别_." + 级别 + ", \"" + 创建键(属性名, 代码) + "\", " + JSON.stringify(名称) + 不需要报告参数 + "),\r\n";
    });
    结果 += "    };\r\n}";
    return 结果;
}
function 构建诊断消息输出(消息表) {
    var 结果 = "{";
    消息表.forEach(function (_a, 名称) {
        var 代码 = _a.代码;
        var 属性名 = 转换属性名称(名称);
        结果 += "\r\n  \"" + 创建键(属性名, 代码) + "\" : \"" + 名称.replace(/[\"]/g, '\\"') + "\",";
    });
    // Shave trailing 逗号_, then add newline and ending brace
    结果 = 结果.slice(0, 结果.length - 1) + "\r\n}";
    // Assert that we generated valid JSON
    JSON.parse(结果);
    return 结果;
}
function 创建键(名称, 代码) {
    return 名称.slice(0, 100) + "_" + 代码;
}
function 转换属性名称(原始名) {
    var 结果 = 原始名.split("").map(function (字符) {
        if (字符 === "*") {
            return "_Asterisk";
        }
        if (字符 === "/") {
            return "_Slash";
        }
        if (字符 === ":") {
            return "_Colon";
        }
        return /\w|[\u4e00-\u9fa5]/.test(字符) ? 字符 : "_";
    }).join("");
    // get rid of all multi-underscores
    结果 = 结果.replace(/_+/g, "_");
    // remove any leading underscore, unless it is followed by a number.
    结果 = 结果.replace(/^_([^\d])/, "$1");
    // get rid of all trailing underscores.
    结果 = 结果.replace(/_$/, "");
    return 结果;
}
启动();
